/*
 * @Author: Dagon
 * @Date: 2021-03-15 19:04:31
 * @Description: 封装队列
 */

// 封装队列类
function Queue() {
  // 属性
  this.items = []
  // 1、 enqueue（element）: 向队列尾部添加一个（或多个）新的项
  Queue.prototype.enqueue = function (element) {
    // this.items.unshift(element)
    this.items.push(element)
    console.log('items', this.items)
  }

  // 2、 dequeue(): 移除队列的第一项，并返回被移除的元素
  Queue.prototype.dequeue = function()  {
    return this.items.shift()
    // return (this.items.splice(this.items.length - 1, 1)).join('');
  }
  // 3、 font（）: 返回队列中第一个元素--最先被添加，也将是最先被移除的元素。队列不做任何变动
  Queue.prototype.font = function() {
    return this.items[0];
  }
  // 4、 isEmpty(): 如果队列中不包含任何元素，返回true， 否则返回false
  Queue.prototype.isEmpty = function() {
    return this.items.length === 0
  }
  // 5、 size(): 返回队列包含的元素个数，与数组的length属性类似
  Queue.prototype.size = function() {
    return this.items.length
  }
  // 6、 toString(): 返回队列中的内容，转成字符串形式
  Queue.prototype.toString = function() {
    return this.items.join('')
  }
}

// 使用
const queue = new Queue()
// queue.enqueue(1)
// queue.enqueue(2)
// queue.enqueue(3)
// queue.enqueue(4)

// console.log(111, queue.dequeue())
// console.log(222, queue.font())
// console.log(333, queue.isEmpty())
// console.log(444, queue.size())
// console.log(555, queue.toString())

/**
 * 击鼓传花游戏算法： 几个朋友一起玩一个游戏，围成一圈，开始数数，数到某个数字的人自动淘汰，最后剩下的这个人会获得
 *   胜利，请问最后剩下的是原来在哪一个位置的人
 * @param {*} num 
 */
function testGame (arr, num) {
  const queue = new Queue()
  arr.forEach(item => {
     queue.enqueue(item)
  });
  while(queue.size() > 1) {
    for(let i = 0; i <= num; i++) {
      if (i < num ) {
        const temp = queue.dequeue()
        queue.enqueue(temp)
      } else {
        queue.dequeue()
      }
    }
  }
  console.log(6666,queue.size())
  return queue.font();
}

console.log(777, testGame(['zhangsan', 'lisi', 'wangwu', 'qianqi'], 5))

